///////////////////////////////////////////////////////////////////////////////
// File:        Realmd.cc
// Author:      671643387@qq.com
// Description: 
///////////////////////////////////////////////////////////////////////////////

#include "Log.hpp"
#include "Ini.hpp"
#include "Realmd.hpp"

///////////////////////////////////////////////////////////////////////////////
#define REALMD_CONF_FILE    "realmd.ini"

Realmd* Realmd::sInst_ = NULL;
///////////////////////////////////////////////////////////////////////////////
Realmd::Realmd(void)
{

}

Realmd::~Realmd(void)
{

}

///////////////////////////////////////////////////////////////////////////////
bool Realmd::Initialize(void)
{
    Ini ini;
    
    try
    {
        ini.Open(REALMD_CONF_FILE);
    }
    catch (...)
    {
        ERROR_LOG("open %s error", REALMD_CONF_FILE);
        loginDB_.Close();
        return false;
    }

    if (!loginDB_.Initialize(ini.Get<std::string>("RealmdConf.LoginDBInfo")))
    {
        ERROR_LOG("Initialize database");
        return false;
    }

    return playerMgr_.Open(
        ini.Get<std::string>("RealmdConf.BindIP"),
        ini.Get<short>("RealmdConf.BindPort"),
        ini.Get<int>("RealmdConf.BindBacklog")
        );
}

void Realmd::Run(void)
{
    playerMgr_.Run();
    _DoCleanup();
}

void Realmd::Stop(void)
{
    playerMgr_.Stop();
    loginDB_.Close();
}

void Realmd::Free(void)
{
    delete this;
}

///////////////////////////////////////////////////////////////////////////////
Realmd* Realmd::GetMe(void)
{
    if (sInst_ == NULL)
        sInst_ = new Realmd();
    assert(sInst_);
    return sInst_;
}

Database* Realmd::GetDB(void)
{
    return &(GetMe()->loginDB_);
}

RealmList* Realmd::GetRealmList(void)
{
    return &(GetMe()->realmList_);
}

///////////////////////////////////////////////////////////////////////////////
void Realmd::_DoCleanup(void)
{
    loginDB_.Close();
}